package com.huajx.armp.htxny.codec;

import com.huajx.util.HexUtil;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;

import java.util.Arrays;

/**
 * @program: di-parent
 * @description: GB/T 32960.3 解码器
 * @author: lisa 叶新华
 * @create: 2020-03-25 16:28
 */
public class HtxnyDecoder extends CumulativeProtocolDecoder {

    // 起始符2 + 命令标识1 + 应答标识1 + 唯一识别码（VIN）17 + 加密方式 1 + 长度 2
    private static final int PACK_HEADER = 24;

    @Override
    protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
        int len = in.remaining();
        if (len >= PACK_HEADER) {
            // 一个可以记忆的Position位置的值，在调用reset()方法时会将缓冲区的Position重置为该索引，并非总是需要定义Mark，
            // 但是在定义Mark时，不能将其定义为负数，并且不能让它大于Position，
            // 如果定义了Mark，则在该Position或Limit调整为小于该Mark值时，该Mark将被丢弃。
            in.mark();

            byte[] bytes = new byte[PACK_HEADER];

            // get操作会导致下面的remaining()值发生变化, 这里减去了相应的长度
            in.get(bytes);

            // 包长
            int packLen = Integer.parseInt(HexUtil.bytesToHex(Arrays.copyOfRange(bytes, 22, 24)), 16);//MessageKit.getInt(bytes, 22, 2);

            if (in.remaining() < packLen) {
                // 如果消息内容不够，则重置恢复position位置到操作前,进入下一轮, 接收新数据，以拼凑成完整数据
                in.reset();
                return false;
            } else {
                // 消息内容足够
                // 重置恢复position位置到操作前
                in.reset();

                // 取出完整包
                byte[] packArr = new byte[PACK_HEADER + packLen + 1];
                in.get(packArr);

                // 输出字符串
                out.write(packArr);

                if (in.hasRemaining()) {
                    return true;
                }

                return false;
            }
        }

        return false;// 处理成功，让父类进行接收下个包
    }
}
